{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-02-21T03:01:05.251790Z",
     "start_time": "2025-02-21T03:00:53.259997Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "source": [
    "x=np.arange(0,12).reshape(3,4)\n",
    "y=np.array([True,False,True])\n",
    "print(y)\n",
    "print(x)\n",
    "x[y,1]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:01:06.877808Z",
     "start_time": "2025-02-21T03:01:06.859760Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ True False  True]\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1, 9])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "source": [
    "#x是特征，y是标签\n",
    "x, y = datasets.make_moons(n_samples=50000, noise=0.3, random_state=42)\n",
    "print(x.shape)\n",
    "print(y.shape)\n",
    "print(np.unique(y))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-21T03:01:11.007712Z",
     "start_time": "2025-02-21T03:01:10.966823Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 2)\n",
      "(50000,)\n",
      "[0 1]\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:01:20.700141Z",
     "start_time": "2025-02-21T03:01:20.023126Z"
    }
   },
   "source": [
    "\n",
    "plt.scatter(x[y == 0, 0], x[y == 0, 1])  #拿到特征中标签为0的第0列，拿到标签为0的第一列\n",
    "plt.scatter(x[y == 1, 0], x[y == 1, 1]) #拿到特征中标签为1的第0列，拿到标签为1的第一列\n",
    "plt.legend(['0', '1'])\n",
    "plt.show()  #图形的点颜色是自动的"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# x[y == 0, 0]"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:01:47.030517Z",
     "start_time": "2025-02-21T03:01:47.007857Z"
    }
   },
   "source": [
    "x[0:10]"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.71820567, -0.21809028],\n",
       "       [ 0.11096372,  1.10964541],\n",
       "       [ 0.61562814, -0.06539887],\n",
       "       [ 0.46175947,  1.17926518],\n",
       "       [ 1.22553968, -0.51211163],\n",
       "       [ 1.27989488,  0.19395679],\n",
       "       [ 0.51249388,  1.21727796],\n",
       "       [ 1.97017831,  0.3277893 ],\n",
       "       [ 0.63961463,  0.9269041 ],\n",
       "       [ 0.38809941, -0.32770396]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:03:11.080244Z",
     "start_time": "2025-02-21T03:03:11.058206Z"
    }
   },
   "source": [
    "np.unique(y)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1], dtype=int64)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:03:15.618180Z",
     "start_time": "2025-02-21T03:03:14.001165Z"
    }
   },
   "source": [
    "#默认分割比例是75%和25%\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)"
   ],
   "outputs": [],
   "execution_count": 7
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:03:17.677072Z",
     "start_time": "2025-02-21T03:03:16.748205Z"
    }
   },
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "#逻辑回归是搞分类的\n",
    "log_clf = LogisticRegression()\n",
    "log_clf.fit(x_train, y_train)\n",
    "log_clf.score(x_test, y_test)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.85344"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:03:41.847988Z",
     "start_time": "2025-02-21T03:03:19.092115Z"
    }
   },
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC() #支持向量机\n",
    "svm_clf.fit(x_train, y_train)\n",
    "svm_clf.score(x_test, y_test)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.91216"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:04:25.682407Z",
     "start_time": "2025-02-21T03:04:24.613689Z"
    }
   },
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dt_clf = DecisionTreeClassifier()\n",
    "dt_clf.fit(x_train, y_train)\n",
    "dt_clf.score(x_test, y_test)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.87576"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 1 手动实现投票分类器"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:04:37.511347Z",
     "start_time": "2025-02-21T03:04:28.270248Z"
    }
   },
   "source": [
    "#训练好模型，测试集做预测\n",
    "y_predict1 = log_clf.predict(x_test)\n",
    "y_predict2 = svm_clf.predict(x_test)\n",
    "y_predict3 = dt_clf.predict(x_test)"
   ],
   "outputs": [],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "source": [
    "#bagging，纯手动bagging\n",
    "y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype='int')\n",
    "y_predict[:10]"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "source": [
    "y_test[:10]"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "#accuracy_score计算准确率的\n",
    "accuracy_score(y_test, y_predict)"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 2 集成学习VotingClassifier(并行)"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:05:25.886376Z",
     "start_time": "2025-02-21T03:05:25.515008Z"
    }
   },
   "source": [
    "from sklearn.ensemble import VotingClassifier\n",
    "\n",
    "#hard模式就是少数服从多数\n",
    "voting_clf = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC()),\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='hard')"
   ],
   "outputs": [],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:06:31.276590Z",
     "start_time": "2025-02-21T03:06:00.829644Z"
    }
   },
   "source": [
    "voting_clf.fit(x_train, y_train)\n",
    "print(voting_clf.score(x_test, y_test))\n",
    "voting_clf.predict(x_test)[:10]"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.90472\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 0, 0, 0, 0, 0, 0, 1], dtype=int64)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "更合理的投票，应该有权值\n",
    "唱歌比赛的投票?(评委的投票权重与观众不一样)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:29:11.967089700Z",
     "start_time": "2024-07-15T08:27:37.656881400Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.9044"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# hard和soft区别请看课件解释,训练时间久\n",
    "voting_clf2 = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC(probability=True)),  #支持向量机中需要加入probability\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='soft')\n",
    "voting_clf2.fit(x_train, y_train)\n",
    "voting_clf2.score(x_test, y_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": "使用bagging"
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "37500.0"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "50000*0.75"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "0.9124"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "\n",
    "#估计器数目是5000呢？bootstrap是有放回抽样,max_samples不可以超过训练集的数目37500\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=300,\n",
    "                                max_samples=3000, bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:32:57.976836200Z",
     "start_time": "2024-07-15T08:32:53.680444800Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 3 oob设计"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:08:52.062396Z",
     "start_time": "2025-02-21T03:08:44.877961Z"
    }
   },
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "#当去做有放回的抽样时，把没有取到的样本作为验证集，可以用oob_score来评估\n",
    "bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=1000,\n",
    "                                 bootstrap=True,\n",
    "                                 oob_score=True)\n",
    "bagging_clf2.fit(x_train, y_train)\n",
    "bagging_clf2.oob_score_  #拿没有取到的样本作为验证集"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9153866666666667"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "source": [
    "bagging_clf2.score(x_test, y_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:08:52.733895Z",
     "start_time": "2025-02-21T03:08:52.067742Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.91296"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### njobs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:36:45.247187Z",
     "start_time": "2024-07-15T08:36:40.093705100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 5 s\n",
      "Wall time: 5.15 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.91176"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=2000,\n",
    "                                bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)\n",
    "#cpu time是实际cpu运行算法时间，wall time是墙上真实时间，就是real time（包含了进程启动时间，I/O等待时间等）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:36:53.890698700Z",
     "start_time": "2024-07-15T08:36:49.395623100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 406 ms\n",
      "Wall time: 4.5 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.91192"
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "#多核使用的时间更小, %%time要顶格来写\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=2000,\n",
    "                                bootstrap=True, n_jobs=-1)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 4 bootstrap_features  对特征进行采样"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-02-21T03:19:18.559952Z",
     "start_time": "2025-02-21T03:19:06.591322Z"
    }
   },
   "source": [
    "#因为我们就两个特征，所以max_features设置为1,得到的分值较低是因为我们特征较少，采用随机特征不合适\n",
    "#这个是只对特征进行采样\n",
    "random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                         n_estimators=500, max_samples=500, oob_score=True,\n",
    "                                         bootstrap=True, n_jobs=-1,\n",
    "                                         max_features=1, bootstrap_features=True)\n",
    "random_subspaces_clf.fit(x, y)\n",
    "random_subspaces_clf.oob_score_"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.88768"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:40:21.116127100Z",
     "start_time": "2024-07-15T08:40:20.094203700Z"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "max_samples must be <= n_samples",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mValueError\u001B[0m                                Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[25], line 6\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 这里是为了验证总的抽样的样本数不能大于训练集的数目\u001B[39;00m\n\u001B[0;32m      2\u001B[0m random_patches_clf \u001B[38;5;241m=\u001B[39m BaggingClassifier(DecisionTreeClassifier(),\n\u001B[0;32m      3\u001B[0m                                        n_estimators\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m500\u001B[39m, max_samples\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m50001\u001B[39m, oob_score\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,\n\u001B[0;32m      4\u001B[0m                                        bootstrap\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m, n_jobs\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m,\n\u001B[0;32m      5\u001B[0m                                        max_features\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m1\u001B[39m, bootstrap_features\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[1;32m----> 6\u001B[0m \u001B[43mrandom_patches_clf\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m      7\u001B[0m random_patches_clf\u001B[38;5;241m.\u001B[39moob_score_\n\u001B[0;32m      8\u001B[0m \u001B[38;5;66;03m#这个代码有另外一个名字就是随机森林\u001B[39;00m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\utils\\validation.py:69\u001B[0m, in \u001B[0;36m_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m     67\u001B[0m extra_args \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mlen\u001B[39m(args) \u001B[38;5;241m-\u001B[39m \u001B[38;5;28mlen\u001B[39m(all_args)\n\u001B[0;32m     68\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m extra_args \u001B[38;5;241m<\u001B[39m\u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[1;32m---> 69\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mf\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m     71\u001B[0m \u001B[38;5;66;03m# extra_args > 0\u001B[39;00m\n\u001B[0;32m     72\u001B[0m args_msg \u001B[38;5;241m=\u001B[39m [\n\u001B[0;32m     73\u001B[0m     \u001B[38;5;124m\"\u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m=\u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(name, arg)\n\u001B[0;32m     74\u001B[0m     \u001B[38;5;28;01mfor\u001B[39;00m name, arg \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mzip\u001B[39m(kwonly_args[:extra_args], args[\u001B[38;5;241m-\u001B[39mextra_args:])\n\u001B[0;32m     75\u001B[0m ]\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\base.py:1473\u001B[0m, in \u001B[0;36m_fit_context.<locals>.decorator.<locals>.wrapper\u001B[1;34m(estimator, *args, **kwargs)\u001B[0m\n\u001B[0;32m   1466\u001B[0m     estimator\u001B[38;5;241m.\u001B[39m_validate_params()\n\u001B[0;32m   1468\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m config_context(\n\u001B[0;32m   1469\u001B[0m     skip_parameter_validation\u001B[38;5;241m=\u001B[39m(\n\u001B[0;32m   1470\u001B[0m         prefer_skip_nested_validation \u001B[38;5;129;01mor\u001B[39;00m global_skip_validation\n\u001B[0;32m   1471\u001B[0m     )\n\u001B[0;32m   1472\u001B[0m ):\n\u001B[1;32m-> 1473\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfit_method\u001B[49m\u001B[43m(\u001B[49m\u001B[43mestimator\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\ensemble\\_bagging.py:402\u001B[0m, in \u001B[0;36mBaseBagging.fit\u001B[1;34m(self, X, y, sample_weight, **fit_params)\u001B[0m\n\u001B[0;32m    399\u001B[0m     sample_weight \u001B[38;5;241m=\u001B[39m _check_sample_weight(sample_weight, X, dtype\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[0;32m    400\u001B[0m     fit_params[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124msample_weight\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m sample_weight\n\u001B[1;32m--> 402\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_fit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_samples\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mmax_samples\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mfit_params\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\ensemble\\_bagging.py:481\u001B[0m, in \u001B[0;36mBaseBagging._fit\u001B[1;34m(self, X, y, max_samples, max_depth, check_input, **fit_params)\u001B[0m\n\u001B[0;32m    478\u001B[0m     max_samples \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mint\u001B[39m(max_samples \u001B[38;5;241m*\u001B[39m X\u001B[38;5;241m.\u001B[39mshape[\u001B[38;5;241m0\u001B[39m])\n\u001B[0;32m    480\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m max_samples \u001B[38;5;241m>\u001B[39m X\u001B[38;5;241m.\u001B[39mshape[\u001B[38;5;241m0\u001B[39m]:\n\u001B[1;32m--> 481\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmax_samples must be <= n_samples\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m    483\u001B[0m \u001B[38;5;66;03m# Store validated integer row sampling value\u001B[39;00m\n\u001B[0;32m    484\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_max_samples \u001B[38;5;241m=\u001B[39m max_samples\n",
      "\u001B[1;31mValueError\u001B[0m: max_samples must be <= n_samples"
     ]
    }
   ],
   "source": [
    "# 这里是为了验证总的抽样的样本数不能大于训练集的数目\n",
    "random_patches_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                       n_estimators=500, max_samples=50001, oob_score=True,\n",
    "                                       bootstrap=True, n_jobs=-1,\n",
    "                                       max_features=1, bootstrap_features=True)\n",
    "random_patches_clf.fit(x, y)\n",
    "random_patches_clf.oob_score_\n",
    "#这个代码有另外一个名字就是随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:24.893739700Z",
     "start_time": "2024-07-15T08:41:24.885744400Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:40.426737100Z",
     "start_time": "2024-07-15T08:41:26.564269300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 1min 14s\n",
      "Wall time: 13.9 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90322"
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "rc_clf = RandomForestClassifier(n_estimators=500, random_state=666,\n",
    "                                oob_score=True, n_jobs=-1)\n",
    "rc_clf.fit(x, y)\n",
    "rc_clf.oob_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 8.03 s\n",
      "Wall time: 1.53 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90296"
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "rc_clf = RandomForestClassifier(max_samples=37500, n_jobs=-1)\n",
    "rc_clf.fit(x_train, y_train)\n",
    "rc_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:57.158954600Z",
     "start_time": "2024-07-15T08:41:49.182493600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 36.8 s\n",
      "Wall time: 7.55 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90962"
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "#max_leaf_nodes 最大的叶子结点数\n",
    "rc_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16,\n",
    "                                 random_state=666,\n",
    "                                 oob_score=True, n_jobs=-1)\n",
    "rc_clf2.fit(x, y)\n",
    "rc_clf2.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 5 Extra-Trees\n",
    "ExtraTreesClassifier 是一种机器学习算法，属于基于决策树的集成方法家族。\n",
    "它随机选择特征子集和数据样本来构建多个决策树，并将它们的预测聚合起来做出最终预测。\n",
    "它可用于分类任务，并以处理嘈杂和高维数据的能力而闻名。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:45:11.260388Z",
     "start_time": "2024-07-15T08:45:04.792884200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.90624"
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "\n",
    "et_clf = ExtraTreesClassifier(n_estimators=500, oob_score=True,\n",
    "                              bootstrap=True, n_jobs=-1)\n",
    "et_clf.fit(x, y)\n",
    "et_clf.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Boosting"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 5 串行（包含adaboost和GBDT）"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:46:14.878104400Z",
     "start_time": "2024-07-15T08:46:14.870109900Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:47:16.925630600Z",
     "start_time": "2024-07-15T08:47:16.293769Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 219 ms\n",
      "Wall time: 222 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.876"
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "ada_clf = AdaBoostClassifier(DecisionTreeClassifier(),algorithm='SAMME',\n",
    "                             n_estimators=500)\n",
    "ada_clf.fit(x_train, y_train)\n",
    "ada_clf.score(x_test, y_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:51:50.113231400Z",
     "start_time": "2024-07-15T08:51:25.285485900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.91192"
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#它默认用的也是决策树，增加了基分类器的数目后，准确率提升\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "gb_clf = GradientBoostingClassifier(max_depth=3, n_estimators=500)\n",
    "gb_clf.fit(x_train, y_train)\n",
    "gb_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1972245773362196\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.0"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "print(np.log(9))  #当错误率是0.1时权重是2.19\n",
    "np.log((1-0.5)/0.5)  #当错误率是0.5时，权重是0"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
